/* yasep/JScore/yasep_flags.js
created 2006-08-10 by whygee@f-cpu.org
2006-08-12
2006-09-02 : moved to vspsim/JScore/
2007-04-01 : added FORM_RI
2007-04-05 : added the jmp/skip related forms
2007-04-08 : cleanup
2007-04-09 : moved elements from JSgui/decoration.js to keep symbols in sync, split from vsp_forms
2007-04-15 : adding the USE_, READ_ and WRITE_ flags
2007-11-05 : rebranding to YASEP, adding IMM16_5LSB and IMM16_8LSB
2007-12-25 : adding FLAG_TEST
2008-11-17 : added FLAG_OPTIONAL|YASEP32_ONLY|YASEP16_ONLY
2009-07-15 : cleanup
2009-07-27 : new version
2009-07-30 : linked to flags.html
2009-08-05 : removed several flags
2009-08-05 : added ABORT_WRITE, NO_WRITEBACK, CHANGE_CARRY, IGNORE_SND, IGNORE_SI4
   and changed the generation of the messages

The flags are additional indications on how to encode the operation,
some for syntactic convenience or readability/consistency,
others for guiding the assembler. They are combined in a bitfield
so their values are consecutive powers of 2.

Dependency : yasep_forms.js defines Y
*/

Y.MAX_FLAG=1;
Y.TableFlags=new Array();
Y.TableFlagsDesc=new Array();

Y.newFlag=function(name,desc){
  Y[name]=Y.MAX_FLAG;
  Y.TableFlags[Y.MAX_FLAG] = name;
  Y.TableFlagsDesc[Y.MAX_FLAG] = desc;
  Y.MAX_FLAG+=Y.MAX_FLAG;
}

Y.newFlag("SWAP_IR","sIR"); // MOV, GET
Y.newFlag("ALIAS_RR","aRR"); // NEG ?
Y.newFlag("ALIAS_IRR","aIRR"); // NEG ?
Y.newFlag("NO_CONDITION","!Cnd");
Y.newFlag("IMM16_5LSB");
Y.newFlag("IMM16_8LSB");
Y.newFlag("OPTIONAL","Opt");
Y.newFlag("YASEP16_ONLY","Y16");
Y.newFlag("YASEP32_ONLY","Y32");
Y.newFlag("IgnoreImmSign"); // SHL, GET/PUT
Y.newFlag("NO_WRITEBACK","!WR"); // CMPx, PUT
Y.newFlag("ABORT_WRITE","aWR"); // xMIN/xMAX
Y.newFlag("CHANGE_CARRY","C"); // ADD,SUB,CMPU,CMPS
Y.newFlag("IGNORE_SND","!snd");
Y.newFlag("IGNORE_SI4","!si4");
Y.newFlag("IGNORE_IMM16","!I16");


Y.flags2html=function(flag){ // used by the opcode map
  var s='';
  var i=1;
  var j=0;
  while (i<=flag) {
    if ((flag & i)&&(Y.TableFlagsDesc[i])) {
      if (j++==3)
        s+='<br>',j=0;
      s+=' <a href="'+prfx+'docs/flags.html#'+Y.TableFlags[i]+'">'+Y.TableFlagsDesc[i]+'</a>';
    }
    i<<=1;
  }
  return s;
}
