// This is emulator of SUBLEQ language. Run with no arguments to see usage. // Oleg Mazonka 10.11.2006 #include #include #include #include #include #include using namespace std; struct Mem { vector v; int & operator[](int i); int size(){ return v.size(); } void dump(); }; void Mem::dump() { for( int i=0; i=v.size() ) v.resize(i+1,0); return v[i]; } Mem mem; string sout="OUT", sin="IN"; int iout=-1, iin=-2; int ip=0; bool loadfrom(istream &in) { while(1) { string s; in>>s; if( !in ) break; if( s.size() < 1 ) break; if( s[0]=='#' ) { if( s.size()==sout.size()+1 && s.substr(1)==sout ) mem[ip++] = iout; else if( s.size()==sin.size()+1 && s.substr(1)==sin ) mem[ip++] = iin; else { cerr<<"Unresolved register "<9 && s.substr(1,8)=="outname=" ) sout = s.substr(9); else if( s.size()>9 && s.substr(1,8)=="outaddr=" ) iout = atoi(s.substr(9).c_str()); else if( s.size()>8 && s.substr(1,7)=="inname=" ) sin = s.substr(8); else if( s.size()>8 && s.substr(1,7)=="inaddr=" ) iin = atoi(s.substr(8).c_str()); else if( s.size()==6 && s.substr(1,5)=="trace" ) trace=true; else if( s.size()==6 && s.substr(1,5)=="steps" ) steps=true; else if( s.size()==6 && s.substr(1,5)=="stdin" ) bcin=true; else { cerr<<"Unknown option ["<>x; cout<>x; mem[b] -= x; if( mem[b]<=0 ) ip=c; if( trace ) cout<<" \tinput [b]="<