Exemplo n.º 1
0
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;
 }
Exemplo n.º 2
0
// --------------------- 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;
}