/*--------------------------------------*/ /* */ /* MIBASIC ver.0.41 */ /* */ /*--------------------------------------*/ #include #include "baslib.H" int scmp(char*); int scmp2(char*); int siki(void); int siki2(int, char, int); int siki3(void); int keisan(int, char, int); void bun(void); void ginit(); char *blist = (char *)0x800a0000; char *fre=(char *)0x800775f0; /* CIP 1.0 書き換え */ char *spd=(char *)0x80075eec; char *usu1=(char *)0x80077650; char *usu2=(char *)0x80084cc8; char *b; int he[26]; int *hhe[26]; int hhef[26]; int g[100]; char *gp[100]; int kk[256]; int err,errn; /*--------------------------------------*/ main() { int i; *(fre++)=0x92; *(fre)=0xdd; *(spd++)=0x80; *(spd)=0x00; *(usu1++)=0xa4; *(usu1)=0xdd; *(usu2++)=0x00; *(usu2++)=0xc2; *(usu2++)=0x01; *(usu2)=0x00; *(blist-1) = '\n'; // 応急処置 INIT(); ginit(); kk['*'] = 1; kk['/'] = 2; kk['%'] = 3; kk['+'] = 4; kk['-'] = 5; kk['&'] = 6; err = 0; b = blist; // printf("%s",b); while (*b != 0x1a){ if ((errn = siki3()) == 0) break; bun(); while (*b == ':'){ b++; bun(); } if (err != 0){ VSYNC(); CLS(); PRINT("ERROR IN "); PRINT(itoa(errn)); VSYNC(); while (STRIG(1) == 0); break; } while (*b != 0x1a){ if (*(b++) == '\n') break; } } DrawSync(0); for (i=0; i<26; i++) if (hhef[i] != 0) free(hhe[i]); } /*--------------------------------------*/ void ginit() { int i = 0; b = blist; while (*b != 0x1a){ gp[i] = b; g[i] = siki3(); while (*b++ != '\n'); i++; } } int scmp(char *cc) { char *tmp = b; while (*tmp == ' ') tmp++; while (*cc != 0) if (*(cc++) != *(tmp++)) return 0; b = tmp; return 1; } int scmp2(char *cc) { if (scmp(cc)) return 1; err = 1; return 0; } /*--------------------------------------*/ int siki() { return siki2(0, '+', siki3()); } int siki2(int s1, char k1, int s2) { int s3; char k2; while (*b == ' ') b++; k2 = *b; if (kk[k2] == 0) return keisan(s1, k1, s2); b++; s3 = siki3(); if (kk[k1] <= kk[k2]) return siki2(keisan(s1, k1, s2), k2, s3); return keisan(s1, k1, siki2(s2, k2, s3)); } keisan(int s1, char k, int s2) { switch (k){ case '+': return s1 + s2; break; case '-': return s1 - s2; break; case '%': return s1 % s2; break; case '*': return s1 * s2; break; case '/': return s1 / s2; break; case '&': return s1 & s2; break; } err = 1; } int siki3() { char aa = *(b++); int tmp; switch (aa){ case ' ': return siki3(); break; case '-': return -siki3(); break; case '(': tmp = siki(); scmp2(")"); return tmp; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': tmp = aa - '0'; aa = *b; while (aa >= '0' && aa <= '9') { tmp = tmp * 10 + (aa - '0'); aa = *(++b); } return tmp; break; case 'R': if (scmp("ND")) return rand() % siki3(); break; case 'S': if (scmp("TICK")) return STICK(siki3()); if (scmp("TRIG")) return STRIG(siki3()); break; } if (aa < 'A' || aa > 'Z'){ err = 1; return 0; } if (*b == '(') return hhe[aa - 'A'][siki3()]; return he[aa - 'A']; } /*--------------------------------------*/ void bun() { char aa = *(b++); char *bb = b; switch (aa){ case ' ': bun(); return; break; case 'P': if (scmp("RINT")){ if (scmp("\"")){ while (*b != '\"') print2(b++); b++; } else PRINT(itoa(siki())); return; } else if (scmp("OLYGON")){ int x, y, z, k,n; scmp("("); x = siki();scmp2(","); y = siki();scmp2(","); z = siki();scmp2(","); k = siki();scmp2(","); n = siki(); scmp(")"); POLYGON(x, y, z, k, n); return; } break; case 'L': if (scmp("OCATE")){ int x; x = siki(); scmp2(","); LOCATE(x, siki()); return; } break; case 'C': if (scmp("LS")){ CLS(); return; } break; case 'V': if (scmp("SYNC")){ VSYNC(); return; } if (scmp("IEW")){ int x1,y1,z1, x2,y2,z2; scmp("("); x1 = siki();scmp2(","); y1 = siki();scmp2(","); z1 = siki();scmp2(","); x2 = siki();scmp2(","); y2 = siki();scmp2(","); z2 = siki(); scmp(")"); VIEW(x1,y1,z1, x2,y2,z2); return; } break; case 'G': if (scmp("OTO")){ int i, gg; gg = siki(); err = 1; for (i=0; i<100; i++) if (g[i] == gg){ b = gp[i]-1; err = 0; break; } return; } break; case 'I': if (scmp("F")){ int ii; ii = siki(); if (scmp("=")){ if (ii == siki()){ scmp("THEN"); bun(); } return; } if (scmp("<>")){ if (ii != siki()){ scmp("THEN"); bun(); } return; } if (scmp(">=")){ if (ii >= siki()){ scmp("THEN"); bun(); } return; } if (scmp("<=")){ if (ii <= siki()){ scmp("THEN"); bun(); } return; } if (scmp(">")){ if (ii > siki()){ scmp("THEN"); bun(); } return; } if (scmp("<")){ if (ii < siki()){ scmp("THEN"); bun(); } return; } err = 1; return; } break; case 'R': if (scmp("EM")) return; break; case 'D': if (scmp("IM")){ int aaa; while (*b == ' ') b++; aa = *(b++); aaa = siki3() + 1; hhe[aa - 'A'] = (int*)malloc(aaa * sizeof(int) +1); if (hhe[aa - 'A'] == NULL) err = 2; else hhef[aa - 'A'] = aaa; return; } break; } while (*b == ' ') b++; if (scmp("=")){ he[aa - 'A'] = siki(); return; } if (*b == '('){ int aaa = siki3(); while (*b == ' ') b++; if (*b == '='){ b++; hhe[aa - 'A'][aaa] = siki(); return; } } err = 1; }