ulen TopLang::makeRules(Collector<RuleRec> &collector,const CondLangBase::RuleDesc &rule) { ulen ret=0; DynArray<ElementRecExt> temp(DoCast(rule.args.len),rule.args.ptr); { ulen index=0; for(auto &rec : temp ) rec.element_index=index++; } auto args=Range(temp); do { if( TestCond(Range_const(args),rule.cond) ) { collector.append_fill(makeRuleName(rule.name,Range_const(args)),rule.index,Range_const(args)); ret++; } } while( Next(args) ); return ret; }
// --------------------- Opcodes 0x50c0+ --------------------- // Emit a Set cc opcode, 0101cccc 11eeeeee int OpSet(int op) { int cc=0,ea=0; int size=0,use=0,changed_cycles=0; const char *cond; cc=(op>>8)&15; ea=op&0x003f; if ((ea&0x38)==0x08) return 1; // dbra, not scc // See if we can do this opcode: if (EaCanWrite(ea)==0) return 1; use=OpBase(op,size); if (op!=use) { OpUse(op,use); return 0; } // Use existing handler changed_cycles=ea<8 && cc>=2; OpStart(op,ea,0,changed_cycles); Cycles=8; if (ea<8) Cycles=4; switch (cc) { case 0x00: // T ot(" mvn r1,#0\n"); if (ea<8) Cycles+=2; break; case 0x01: // F ot(" mov r1,#0\n"); break; default: ot(" mov r1,#0\n"); cond=TestCond(cc); ot(" mvn%s r1,#0\n",cond); if (ea<8) ot(" sub%s r5,r5,#2 ;@ Extra cycles\n",cond); break; } ot("\n"); eawrite_check_addrerr=1; EaCalc (0,0x003f, ea,size,earwt_msb_dont_care); EaWrite(0, 1, ea,size,0x003f,earwt_msb_dont_care); opend_op_changes_cycles=changed_cycles; OpEnd(ea,0); return 0; }