* along with this program. If not, see <http://www.gnu.org/licenses/>.\r
*\r
* For further information please contact.\r
- * http://nyatla.jp/\r
- * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * http://nyatla.jp/\r
+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
*\r
*********************************************************************************/\r
#include <ctype.h>\r
\r
struct TInstructionDef\r
{\r
- /** MiMicBCのオペコード */\r
- const char* bcopcode;\r
- /** インストラクションID */\r
- NyLPC_TcMiMicVM_OP_TYPE opid;\r
- /** オペコードのタイプ */\r
- NyLPC_TcMiMicVM_OPR_TYPE optype;\r
+ /** MiMicBCのオペコード */\r
+ const char* bcopcode;\r
+ /** インストラクションID */\r
+ NyLPC_TcMiMicVM_OP_TYPE opid;\r
+ /** オペコードのタイプ */\r
+ NyLPC_TcMiMicVM_OPR_TYPE optype;\r
};\r
static NyLPC_TBool bc2opc(const NyLPC_TChar* i_char,NyLPC_TcMiMicVM_OP_TYPE* o_opc,NyLPC_TcMiMicVM_OPR_TYPE* o_opt);\r
static NyLPC_TBool bc2ctrlc(const NyLPC_TChar* i_char,NyLPC_TcMiMicVM_OP_TYPE* o_opc,NyLPC_TcMiMicVM_OPR_TYPE* o_opt);\r
\r
void NyLPC_cMiMicTxtCompiler_initialize(NyLPC_TcMiMicTxtCompiler_t* i_inst)\r
{\r
- i_inst->out_buf=NULL;\r
- i_inst->st=NyLPC_TcMiMicTxtCompiler_ST_OPC;\r
- i_inst->tmp_len=0;\r
+ i_inst->out_buf=NULL;\r
+ i_inst->st=NyLPC_TcMiMicTxtCompiler_ST_OPC;\r
+ i_inst->tmp_len=0;\r
}\r
\r
\r
\r
-#define NyLPC_TcMiMicTxtCompiler_ST_OPC 0x01 //OPをパース中\r
-#define NyLPC_TcMiMicTxtCompiler_ST_OPR 0x02 //オペランドを解析中\r
-#define NyLPC_TcMiMicTxtCompiler_ST_CTR 0x03 //制御パラメータを解析中\r
-#define NyLPC_TcMiMicTxtCompiler_ST_OK 0x04 //パースを完了した。(.EMD検出)\r
-#define NyLPC_TcMiMicTxtCompiler_ST_NG 0xff //パースでエラーが発生ウェーイ\r
+#define NyLPC_TcMiMicTxtCompiler_ST_OPC 0x01 //OPをパース中\r
+#define NyLPC_TcMiMicTxtCompiler_ST_OPR 0x02 //オペランドを解析中\r
+#define NyLPC_TcMiMicTxtCompiler_ST_CTR 0x03 //制御パラメータを解析中\r
+#define NyLPC_TcMiMicTxtCompiler_ST_OK 0x04 //パースを完了した。(.EMD検出)\r
+#define NyLPC_TcMiMicTxtCompiler_ST_NG 0xff //パースでエラーが発生ウェーイ\r
\r
\r
\r
*/\r
NyLPC_TcMiMicTxtCompiler_RET NyLPC_cMiMicTxtCompiler_compileFragment(NyLPC_TcMiMicTxtCompiler_t* i_inst,const struct NyLPC_TCharArrayPtr* i_bc,struct NyLPC_TUInt32ArrayPtr* i_bin,NyLPC_TUInt16* o_bin_len,NyLPC_TUInt16* o_parsed_bc)\r
{\r
- union NyLPC_TcMiMicVM_TInstruction* wptr;\r
- int i;\r
- for(i=0;i<i_bc->len;i++)\r
- {\r
- switch(i_inst->st){\r
- case NyLPC_TcMiMicTxtCompiler_ST_OPC:\r
- if(i_inst->tmp_len>2){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- i_inst->tmp[i_inst->tmp_len]=*(i_bc->ptr+i);\r
- i_inst->tmp_len++;\r
- if(i_inst->tmp_len==2){\r
- //[A-Z]{2}がそろった。命令コードか制御命令か判定\r
- if(bc2opc(i_inst->tmp,&(i_inst->_current_opc),&(i_inst->_current_oprtype))){\r
- //命令コードならインストラクションの情報をもらってくる。\r
- NyLPC_TcMiMicVM_OPR_TYPE_getOpInfo(i_inst->_current_oprtype,&i_inst->_oprbc_len,&i_inst->_inst_len);\r
- //オペランドが無ければ、命令確定。\r
- if(i_inst->_oprbc_len<=0){\r
- //書込みポインタ保管\r
- wptr=(union NyLPC_TcMiMicVM_TInstruction*)i_bin->ptr;\r
- //バッファのシーク\r
- if(!NyLPC_TUInt32ArrayPtr_seek(i_bin,1)){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- //インストラクションの出力と処理したBC長の計算\r
- wptr->op.opc=i_inst->_current_opc;\r
- wptr->op.oprtype=i_inst->_current_oprtype;\r
- *o_parsed_bc=i+1; //パースしたBCの長さ\r
- *o_bin_len=i_inst->_inst_len;\r
- //解析バッファの長さをリセットして、次のBCブロックのパース準備\r
- i_inst->tmp_len=0;\r
- return NyLPC_TcMiMicTxtCompiler_RET_OK;//命令確定。\r
- }\r
- //オペランドがあるなら、パース対象を変更。\r
- i_inst->tmp_len=0;\r
- i_inst->st=NyLPC_TcMiMicTxtCompiler_ST_OPR;\r
- }else if(bc2ctrlc(i_inst->tmp,&(i_inst->_current_opc),&(i_inst->_current_oprtype))){\r
- //命令コードならインストラクションの情報をもらってくる。\r
- NyLPC_TcMiMicVM_OPR_TYPE_getOpInfo(i_inst->_current_oprtype,&i_inst->_oprbc_len,&i_inst->_inst_len);\r
- //制御コードの解析\r
- if(i_inst->_oprbc_len>0){\r
- //パラメータのある制御命令未定義だからエラー。\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- //END制御命令?\r
- if(i_inst->_current_opc==NyLPC_TcMiMicVM_CP_TYPE_END){\r
- *o_bin_len=0;\r
- *o_parsed_bc=i+1; //パースしたBCの長さ\r
- i_inst->tmp_len=0;\r
- return NyLPC_TcMiMicTxtCompiler_RET_OK_END;//命令確定。(パース完了)\r
- }\r
- //END制御命令以外ならエラー\r
- NyLPC_OnErrorGoto(ERROR);\r
- }else{\r
- //不明な命令\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- }\r
- break;\r
- case NyLPC_TcMiMicTxtCompiler_ST_CTR:\r
- NyLPC_OnErrorGoto(ERROR);\r
- case NyLPC_TcMiMicTxtCompiler_ST_OPR:\r
- //オペランド蓄積.\r
- i_inst->tmp[i_inst->tmp_len]=*(i_bc->ptr+i);\r
- i_inst->tmp_len++;\r
- //オペランド長さになるまで値を追記\r
- if(i_inst->_oprbc_len==i_inst->tmp_len){\r
- //書込みポインタ保管\r
- wptr=(union NyLPC_TcMiMicVM_TInstruction*)i_bin->ptr;\r
- //シーク\r
- if(!NyLPC_TUInt32ArrayPtr_seek(i_bin,i_inst->_inst_len)){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- wptr->op.opc=i_inst->_current_opc;\r
- wptr->op.oprtype=i_inst->_current_oprtype;\r
- //オペランドの変換処理\r
- switch(i_inst->_current_oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- if(!( txt2WMId(i_inst->tmp,&(wptr->wmwm_32.wm1)) &&\r
- txt2WMId(i_inst->tmp+2,&(wptr->wmwm_32.wm2))))\r
- {\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H08:\r
- if(!( txt2WMId(i_inst->tmp,&(wptr->wmh08_32.wm)) &&\r
- txt2UInt(i_inst->tmp+2,2,&(wptr->wmh08_32.h8))))\r
- {\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
- if(!( txt2WMId(i_inst->tmp,&(wptr->wmh32_64.wm)) &&\r
- txt2UInt(i_inst->tmp+2,8,&(wptr->wmh32_64.h32)))){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
- if(!txt2WMId(i_inst->tmp,&(wptr->wm_32.wm))){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_H32:\r
- if(!txt2UInt(i_inst->tmp,8,&(wptr->h32_64.h32))){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_H08:\r
- if(!txt2UInt(i_inst->tmp,2,&(wptr->h8_32.h8)))\r
- {\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- //OPR解析成功。パースしたブロックサイズの計算。\r
- *o_parsed_bc=i+1; //パースしたBCの長さ\r
- *o_bin_len=i_inst->_inst_len;\r
- i_inst->tmp_len=0;\r
- i_inst->st=NyLPC_TcMiMicTxtCompiler_ST_OPC;\r
- return NyLPC_TcMiMicTxtCompiler_RET_OK;\r
- }\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- }\r
- *o_bin_len=0;\r
- *o_parsed_bc=i_bc->len;\r
- return NyLPC_TcMiMicTxtCompiler_RET_CONTINUE;\r
+ union NyLPC_TcMiMicVM_TInstruction* wptr;\r
+ int i;\r
+ for(i=0;i<i_bc->len;i++)\r
+ {\r
+ switch(i_inst->st){\r
+ case NyLPC_TcMiMicTxtCompiler_ST_OPC:\r
+ if(i_inst->tmp_len>2){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ i_inst->tmp[i_inst->tmp_len]=*(i_bc->ptr+i);\r
+ i_inst->tmp_len++;\r
+ if(i_inst->tmp_len==2){\r
+ //[A-Z]{2}がそろった。命令コードか制御命令か判定\r
+ if(bc2opc(i_inst->tmp,&(i_inst->_current_opc),&(i_inst->_current_oprtype))){\r
+ //命令コードならインストラクションの情報をもらってくる。\r
+ NyLPC_TcMiMicVM_OPR_TYPE_getOpInfo(i_inst->_current_oprtype,&i_inst->_oprbc_len,&i_inst->_inst_len);\r
+ //オペランドが無ければ、命令確定。\r
+ if(i_inst->_oprbc_len<=0){\r
+ //書込みポインタ保管\r
+ wptr=(union NyLPC_TcMiMicVM_TInstruction*)i_bin->ptr;\r
+ //バッファのシーク\r
+ if(!NyLPC_TUInt32ArrayPtr_seek(i_bin,1)){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ //インストラクションの出力と処理したBC長の計算\r
+ wptr->op.opc=i_inst->_current_opc;\r
+ wptr->op.oprtype=i_inst->_current_oprtype;\r
+ *o_parsed_bc=i+1; //パースしたBCの長さ\r
+ *o_bin_len=i_inst->_inst_len;\r
+ //解析バッファの長さをリセットして、次のBCブロックのパース準備\r
+ i_inst->tmp_len=0;\r
+ return NyLPC_TcMiMicTxtCompiler_RET_OK;//命令確定。\r
+ }\r
+ //オペランドがあるなら、パース対象を変更。\r
+ i_inst->tmp_len=0;\r
+ i_inst->st=NyLPC_TcMiMicTxtCompiler_ST_OPR;\r
+ }else if(bc2ctrlc(i_inst->tmp,&(i_inst->_current_opc),&(i_inst->_current_oprtype))){\r
+ //命令コードならインストラクションの情報をもらってくる。\r
+ NyLPC_TcMiMicVM_OPR_TYPE_getOpInfo(i_inst->_current_oprtype,&i_inst->_oprbc_len,&i_inst->_inst_len);\r
+ //制御コードの解析\r
+ if(i_inst->_oprbc_len>0){\r
+ //パラメータのある制御命令未定義だからエラー。\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ //END制御命令?\r
+ if(i_inst->_current_opc==NyLPC_TcMiMicVM_CP_TYPE_END){\r
+ *o_bin_len=0;\r
+ *o_parsed_bc=i+1; //パースしたBCの長さ\r
+ i_inst->tmp_len=0;\r
+ return NyLPC_TcMiMicTxtCompiler_RET_OK_END;//命令確定。(パース完了)\r
+ }\r
+ //END制御命令以外ならエラー\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }else{\r
+ //不明な命令\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicTxtCompiler_ST_CTR:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ case NyLPC_TcMiMicTxtCompiler_ST_OPR:\r
+ //オペランド蓄積.\r
+ i_inst->tmp[i_inst->tmp_len]=*(i_bc->ptr+i);\r
+ i_inst->tmp_len++;\r
+ //オペランド長さになるまで値を追記\r
+ if(i_inst->_oprbc_len==i_inst->tmp_len){\r
+ //書込みポインタ保管\r
+ wptr=(union NyLPC_TcMiMicVM_TInstruction*)i_bin->ptr;\r
+ //シーク\r
+ if(!NyLPC_TUInt32ArrayPtr_seek(i_bin,i_inst->_inst_len)){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ wptr->op.opc=i_inst->_current_opc;\r
+ wptr->op.oprtype=i_inst->_current_oprtype;\r
+ //オペランドの変換処理\r
+ switch(i_inst->_current_oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ if(!( txt2WMId(i_inst->tmp,&(wptr->wmwm_32.wm1)) &&\r
+ txt2WMId(i_inst->tmp+2,&(wptr->wmwm_32.wm2))))\r
+ {\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H08:\r
+ if(!( txt2WMId(i_inst->tmp,&(wptr->wmh08_32.wm)) &&\r
+ txt2UInt(i_inst->tmp+2,2,&(wptr->wmh08_32.h8))))\r
+ {\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
+ if(!( txt2WMId(i_inst->tmp,&(wptr->wmh32_64.wm)) &&\r
+ txt2UInt(i_inst->tmp+2,8,&(wptr->wmh32_64.h32)))){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
+ if(!txt2WMId(i_inst->tmp,&(wptr->wm_32.wm))){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_H32:\r
+ if(!txt2UInt(i_inst->tmp,8,&(wptr->h32_64.h32))){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_H08:\r
+ if(!txt2UInt(i_inst->tmp,2,&(wptr->h8_32.h8)))\r
+ {\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ //OPR解析成功。パースしたブロックサイズの計算。\r
+ *o_parsed_bc=i+1; //パースしたBCの長さ\r
+ *o_bin_len=i_inst->_inst_len;\r
+ i_inst->tmp_len=0;\r
+ i_inst->st=NyLPC_TcMiMicTxtCompiler_ST_OPC;\r
+ return NyLPC_TcMiMicTxtCompiler_RET_OK;\r
+ }\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ }\r
+ *o_bin_len=0;\r
+ *o_parsed_bc=i_bc->len;\r
+ return NyLPC_TcMiMicTxtCompiler_RET_CONTINUE;\r
ERROR:\r
- i_inst->st=NyLPC_TcMiMicTxtCompiler_ST_NG;\r
- return NyLPC_TcMiMicTxtCompiler_RET_NG;\r
+ i_inst->st=NyLPC_TcMiMicTxtCompiler_ST_NG;\r
+ return NyLPC_TcMiMicTxtCompiler_RET_NG;\r
}\r
\r
\r
*/\r
NyLPC_TcMiMicTxtCompiler_RET NyLPC_cMiMicTxtCompiler_compileFragment2(NyLPC_TcMiMicTxtCompiler_t* i_inst,NyLPC_TChar i_bc,struct NyLPC_TUInt32ArrayPtr* i_bin,NyLPC_TUInt16* o_bin_len)\r
{\r
- struct NyLPC_TCharArrayPtr bc;\r
- NyLPC_TUInt16 bc_len;\r
- bc.ptr=&i_bc;\r
- bc.len=1;\r
- return NyLPC_cMiMicTxtCompiler_compileFragment(i_inst,&bc,i_bin,o_bin_len,&bc_len);\r
+ struct NyLPC_TCharArrayPtr bc;\r
+ NyLPC_TUInt16 bc_len;\r
+ bc.ptr=&i_bc;\r
+ bc.len=1;\r
+ return NyLPC_cMiMicTxtCompiler_compileFragment(i_inst,&bc,i_bin,o_bin_len,&bc_len);\r
}\r
\r
\r
*/\r
static NyLPC_TBool bc2ctrlc(const NyLPC_TChar* i_char,NyLPC_TcMiMicVM_OP_TYPE* o_opc,NyLPC_TcMiMicVM_OPR_TYPE* o_opt)\r
{\r
- //バイトコード変換の為のテーブル\r
- const struct TInstructionDef _bc_type_tbl[]=\r
- {\r
- //制御命令\r
- {".E",NyLPC_TcMiMicVM_CP_TYPE_END,NyLPC_TcMiMicVM_OPR_TYPE_NONE},\r
- {NULL}\r
- };\r
- int i;\r
- for(i=0;_bc_type_tbl[i].bcopcode!=NULL;i++){\r
- //2バイト一致?\r
- if((*i_char==_bc_type_tbl[i].bcopcode[0])&&(*(i_char+1)==_bc_type_tbl[i].bcopcode[1])){\r
- *o_opc=_bc_type_tbl[i].opid;\r
- *o_opt=_bc_type_tbl[i].optype;\r
- return NyLPC_TBool_TRUE;\r
- }\r
- }\r
- return NyLPC_TBool_FALSE;\r
+ //バイトコード変換の為のテーブル\r
+ const struct TInstructionDef _bc_type_tbl[]=\r
+ {\r
+ //制御命令\r
+ {".E",NyLPC_TcMiMicVM_CP_TYPE_END,NyLPC_TcMiMicVM_OPR_TYPE_NONE},\r
+ {NULL}\r
+ };\r
+ int i;\r
+ for(i=0;_bc_type_tbl[i].bcopcode!=NULL;i++){\r
+ //2バイト一致?\r
+ if((*i_char==_bc_type_tbl[i].bcopcode[0])&&(*(i_char+1)==_bc_type_tbl[i].bcopcode[1])){\r
+ *o_opc=_bc_type_tbl[i].opid;\r
+ *o_opt=_bc_type_tbl[i].optype;\r
+ return NyLPC_TBool_TRUE;\r
+ }\r
+ }\r
+ return NyLPC_TBool_FALSE;\r
}\r
\r
\r
*/\r
static NyLPC_TBool bc2opc(const NyLPC_TChar* i_char,NyLPC_TcMiMicVM_OP_TYPE* o_opc,NyLPC_TcMiMicVM_OPR_TYPE* o_opt)\r
{\r
- //バイトコード変換の為のテーブル\r
- const struct TInstructionDef _bc_type_tbl[]=\r
- {\r
- {"AA",NyLPC_TcMiMicVM_OP_TYPE_AND,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
- {"AB",NyLPC_TcMiMicVM_OP_TYPE_AND,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
- {"AE",NyLPC_TcMiMicVM_OP_TYPE_OR,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
- {"AF",NyLPC_TcMiMicVM_OP_TYPE_OR,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
- {"AI",NyLPC_TcMiMicVM_OP_TYPE_XOR,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
- {"AJ",NyLPC_TcMiMicVM_OP_TYPE_XOR,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
- {"AM",NyLPC_TcMiMicVM_OP_TYPE_NOT,NyLPC_TcMiMicVM_OPR_TYPE_WM},\r
-\r
- {"BA",NyLPC_TcMiMicVM_OP_TYPE_SHL,NyLPC_TcMiMicVM_OPR_TYPE_WM_H08},\r
- {"BB",NyLPC_TcMiMicVM_OP_TYPE_SHL,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
- {"BE",NyLPC_TcMiMicVM_OP_TYPE_SHR,NyLPC_TcMiMicVM_OPR_TYPE_WM_H08},\r
- {"BF",NyLPC_TcMiMicVM_OP_TYPE_SHR,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
-\r
- {"CA",NyLPC_TcMiMicVM_OP_TYPE_ADD,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
- {"CB",NyLPC_TcMiMicVM_OP_TYPE_ADD,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
- {"CE",NyLPC_TcMiMicVM_OP_TYPE_SUB,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
- {"CF",NyLPC_TcMiMicVM_OP_TYPE_SUB,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
- {"CI",NyLPC_TcMiMicVM_OP_TYPE_MUL,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
- {"CJ",NyLPC_TcMiMicVM_OP_TYPE_MUL,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
-\r
- {"DA",NyLPC_TcMiMicVM_OP_TYPE_MGET,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
- {"DB",NyLPC_TcMiMicVM_OP_TYPE_MGET,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
- {"DE",NyLPC_TcMiMicVM_OP_TYPE_MPUT,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
- {"DF",NyLPC_TcMiMicVM_OP_TYPE_MPUT,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
-\r
- {"EA",NyLPC_TcMiMicVM_OP_TYPE_SGET,NyLPC_TcMiMicVM_OPR_TYPE_WM},\r
- {"EE",NyLPC_TcMiMicVM_OP_TYPE_SPUT,NyLPC_TcMiMicVM_OPR_TYPE_WM},\r
- {"EF",NyLPC_TcMiMicVM_OP_TYPE_SPUT,NyLPC_TcMiMicVM_OPR_TYPE_H32},\r
-\r
- {"FA",NyLPC_TcMiMicVM_OP_TYPE_LD,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
- {"FB",NyLPC_TcMiMicVM_OP_TYPE_LD,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
-\r
- {"ZA",NyLPC_TcMiMicVM_OP_TYPE_NOP,NyLPC_TcMiMicVM_OPR_TYPE_NONE},\r
- {"ZB",NyLPC_TcMiMicVM_OP_TYPE_NOP,NyLPC_TcMiMicVM_OPR_TYPE_H08},\r
-\r
- {"ZE",NyLPC_TcMiMicVM_OP_TYPE_CALL,NyLPC_TcMiMicVM_OPR_TYPE_WM},\r
- {"ZF",NyLPC_TcMiMicVM_OP_TYPE_CALL,NyLPC_TcMiMicVM_OPR_TYPE_H32},\r
-\r
-\r
- {"ZZ",NyLPC_TcMiMicVM_OP_TYPE_EXIT,NyLPC_TcMiMicVM_OPR_TYPE_NONE},\r
- {NULL}\r
- };\r
- int i;\r
- //ここ早くできますよね。\r
- for(i=0;_bc_type_tbl[i].bcopcode!=NULL;i++){\r
- //2バイト一致?\r
- if((*i_char==_bc_type_tbl[i].bcopcode[0])&&(*(i_char+1)==_bc_type_tbl[i].bcopcode[1])){\r
- *o_opc=_bc_type_tbl[i].opid;\r
- *o_opt=_bc_type_tbl[i].optype;\r
- return NyLPC_TBool_TRUE;\r
- }\r
- }\r
- return NyLPC_TBool_FALSE;\r
+ //バイトコード変換の為のテーブル\r
+ const struct TInstructionDef _bc_type_tbl[]=\r
+ {\r
+ {"AA",NyLPC_TcMiMicVM_OP_TYPE_AND,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
+ {"AB",NyLPC_TcMiMicVM_OP_TYPE_AND,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
+ {"AE",NyLPC_TcMiMicVM_OP_TYPE_OR,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
+ {"AF",NyLPC_TcMiMicVM_OP_TYPE_OR,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
+ {"AI",NyLPC_TcMiMicVM_OP_TYPE_XOR,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
+ {"AJ",NyLPC_TcMiMicVM_OP_TYPE_XOR,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
+ {"AM",NyLPC_TcMiMicVM_OP_TYPE_NOT,NyLPC_TcMiMicVM_OPR_TYPE_WM},\r
+\r
+ {"BA",NyLPC_TcMiMicVM_OP_TYPE_SHL,NyLPC_TcMiMicVM_OPR_TYPE_WM_H08},\r
+ {"BB",NyLPC_TcMiMicVM_OP_TYPE_SHL,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
+ {"BE",NyLPC_TcMiMicVM_OP_TYPE_SHR,NyLPC_TcMiMicVM_OPR_TYPE_WM_H08},\r
+ {"BF",NyLPC_TcMiMicVM_OP_TYPE_SHR,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
+\r
+ {"CA",NyLPC_TcMiMicVM_OP_TYPE_ADD,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
+ {"CB",NyLPC_TcMiMicVM_OP_TYPE_ADD,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
+ {"CE",NyLPC_TcMiMicVM_OP_TYPE_SUB,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
+ {"CF",NyLPC_TcMiMicVM_OP_TYPE_SUB,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
+ {"CI",NyLPC_TcMiMicVM_OP_TYPE_MUL,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
+ {"CJ",NyLPC_TcMiMicVM_OP_TYPE_MUL,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
+\r
+ {"DA",NyLPC_TcMiMicVM_OP_TYPE_MGET,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
+ {"DB",NyLPC_TcMiMicVM_OP_TYPE_MGET,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
+ {"DE",NyLPC_TcMiMicVM_OP_TYPE_MPUT,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
+ {"DF",NyLPC_TcMiMicVM_OP_TYPE_MPUT,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
+\r
+ {"EA",NyLPC_TcMiMicVM_OP_TYPE_SGET,NyLPC_TcMiMicVM_OPR_TYPE_WM},\r
+ {"EE",NyLPC_TcMiMicVM_OP_TYPE_SPUT,NyLPC_TcMiMicVM_OPR_TYPE_WM},\r
+ {"EF",NyLPC_TcMiMicVM_OP_TYPE_SPUT,NyLPC_TcMiMicVM_OPR_TYPE_H32},\r
+\r
+ {"FA",NyLPC_TcMiMicVM_OP_TYPE_LD,NyLPC_TcMiMicVM_OPR_TYPE_WM_WM},\r
+ {"FB",NyLPC_TcMiMicVM_OP_TYPE_LD,NyLPC_TcMiMicVM_OPR_TYPE_WM_H32},\r
+\r
+ {"ZA",NyLPC_TcMiMicVM_OP_TYPE_NOP,NyLPC_TcMiMicVM_OPR_TYPE_NONE},\r
+ {"ZB",NyLPC_TcMiMicVM_OP_TYPE_NOP,NyLPC_TcMiMicVM_OPR_TYPE_H08},\r
+\r
+ {"ZE",NyLPC_TcMiMicVM_OP_TYPE_CALL,NyLPC_TcMiMicVM_OPR_TYPE_WM},\r
+ {"ZF",NyLPC_TcMiMicVM_OP_TYPE_CALL,NyLPC_TcMiMicVM_OPR_TYPE_H32},\r
+\r
+\r
+ {"ZZ",NyLPC_TcMiMicVM_OP_TYPE_EXIT,NyLPC_TcMiMicVM_OPR_TYPE_NONE},\r
+ {NULL}\r
+ };\r
+ int i;\r
+ //ここ早くできますよね。\r
+ for(i=0;_bc_type_tbl[i].bcopcode!=NULL;i++){\r
+ //2バイト一致?\r
+ if((*i_char==_bc_type_tbl[i].bcopcode[0])&&(*(i_char+1)==_bc_type_tbl[i].bcopcode[1])){\r
+ *o_opc=_bc_type_tbl[i].opid;\r
+ *o_opt=_bc_type_tbl[i].optype;\r
+ return NyLPC_TBool_TRUE;\r
+ }\r
+ }\r
+ return NyLPC_TBool_FALSE;\r
}\r
\r
\r
*/\r
static NyLPC_TBool txt2UInt(const NyLPC_TChar* i_txt,NyLPC_TUInt8 i_num,void* out)\r
{\r
- NyLPC_TUInt32 ret=0;\r
- NyLPC_TChar c;\r
- int i;\r
-\r
- for(i=0;i<i_num;i++){\r
- c=(*(i_txt+i));\r
- if('f'>=c && c>='a'){\r
- c=c-(NyLPC_TUInt8)'a'+10;\r
- }else if('9'>=c && c>='0'){\r
- c-=(NyLPC_TUInt8)'0';\r
- }else{\r
- return NyLPC_TBool_FALSE;\r
- }\r
- ret=(ret<<4)|c;\r
- }\r
- //2,4,8だけ。\r
- switch(i_num){\r
- case 2:\r
- *((NyLPC_TUInt8*)out)=(NyLPC_TUInt8)ret;\r
- break;\r
- case 4:\r
- *((NyLPC_TUInt16*)out)=(NyLPC_TUInt16)ret;\r
- break;\r
- case 8:\r
- *((NyLPC_TUInt32*)out)=(NyLPC_TUInt32)ret;\r
- break;\r
- default:\r
- return NyLPC_TBool_FALSE;\r
- }\r
- return NyLPC_TBool_TRUE;\r
+ NyLPC_TUInt32 ret=0;\r
+ NyLPC_TChar c;\r
+ int i;\r
+\r
+ for(i=0;i<i_num;i++){\r
+ c=(*(i_txt+i));\r
+ if('f'>=c && c>='a'){\r
+ c=c-(NyLPC_TUInt8)'a'+10;\r
+ }else if('9'>=c && c>='0'){\r
+ c-=(NyLPC_TUInt8)'0';\r
+ }else{\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ ret=(ret<<4)|c;\r
+ }\r
+ //2,4,8だけ。\r
+ switch(i_num){\r
+ case 2:\r
+ *((NyLPC_TUInt8*)out)=(NyLPC_TUInt8)ret;\r
+ break;\r
+ case 4:\r
+ *((NyLPC_TUInt16*)out)=(NyLPC_TUInt16)ret;\r
+ break;\r
+ case 8:\r
+ *((NyLPC_TUInt32*)out)=(NyLPC_TUInt32)ret;\r
+ break;\r
+ default:\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
}\r
/**\r
* テキストデータをWMIDに変換する。WMIDは、VMの使用の影響を受ける。\r
*/\r
static NyLPC_TBool txt2WMId(const NyLPC_TChar* i_txt,NyLPC_TUInt8* out)\r
{\r
- if(txt2UInt(i_txt,2,out)){\r
- if(*out<=NyLPC_TcMiMicVM_NUMBER_OF_WM){\r
- return NyLPC_TBool_TRUE;\r
- }\r
- }\r
- return NyLPC_TBool_FALSE;\r
+ if(txt2UInt(i_txt,2,out)){\r
+ if(*out<=NyLPC_TcMiMicVM_NUMBER_OF_WM){\r
+ return NyLPC_TBool_TRUE;\r
+ }\r
+ }\r
+ return NyLPC_TBool_FALSE;\r
}\r
/**\r
* オペランドタイプからオペランドのBC長と、インストラクションサイズを計算\r
*/\r
static void NyLPC_TcMiMicVM_OPR_TYPE_getOpInfo(NyLPC_TcMiMicVM_OPR_TYPE i_type,NyLPC_TUInt8* oprbc_len,NyLPC_TUInt8* o_istlen)\r
{\r
- const struct{\r
- NyLPC_TcMiMicVM_OPR_TYPE t;\r
- NyLPC_TUInt8 oprbc_len;\r
- NyLPC_TUInt8 ist_len;\r
- }_tbl[]={\r
- {NyLPC_TcMiMicVM_OPR_TYPE_NONE, 0, 1},\r
- {NyLPC_TcMiMicVM_OPR_TYPE_WM_WM, (1+1)*2, 1},\r
- {NyLPC_TcMiMicVM_OPR_TYPE_WM_H08, (1+1)*2, 1},\r
- {NyLPC_TcMiMicVM_OPR_TYPE_WM_H16, (1+2)*2, 2},\r
- {NyLPC_TcMiMicVM_OPR_TYPE_WM_H32, (1+4)*2, 2},\r
- {NyLPC_TcMiMicVM_OPR_TYPE_WM, (1)*2, 1},\r
- {NyLPC_TcMiMicVM_OPR_TYPE_H08, (1)*2, 1},\r
- {NyLPC_TcMiMicVM_OPR_TYPE_H16, (2)*2, 1},\r
- {NyLPC_TcMiMicVM_OPR_TYPE_H32, (4)*2, 2},\r
- {0,0,0}\r
- };\r
- int i;\r
- for(i=0;_tbl[i].t!=0;i++){\r
- if(_tbl[i].t==i_type){\r
- *oprbc_len=_tbl[i].oprbc_len;\r
- *o_istlen=_tbl[i].ist_len;\r
- return;\r
- }\r
- }\r
- NyLPC_Abort();\r
- return;\r
+ const struct{\r
+ NyLPC_TcMiMicVM_OPR_TYPE t;\r
+ NyLPC_TUInt8 oprbc_len;\r
+ NyLPC_TUInt8 ist_len;\r
+ }_tbl[]={\r
+ {NyLPC_TcMiMicVM_OPR_TYPE_NONE, 0, 1},\r
+ {NyLPC_TcMiMicVM_OPR_TYPE_WM_WM, (1+1)*2, 1},\r
+ {NyLPC_TcMiMicVM_OPR_TYPE_WM_H08, (1+1)*2, 1},\r
+ {NyLPC_TcMiMicVM_OPR_TYPE_WM_H16, (1+2)*2, 2},\r
+ {NyLPC_TcMiMicVM_OPR_TYPE_WM_H32, (1+4)*2, 2},\r
+ {NyLPC_TcMiMicVM_OPR_TYPE_WM, (1)*2, 1},\r
+ {NyLPC_TcMiMicVM_OPR_TYPE_H08, (1)*2, 1},\r
+ {NyLPC_TcMiMicVM_OPR_TYPE_H16, (2)*2, 1},\r
+ {NyLPC_TcMiMicVM_OPR_TYPE_H32, (4)*2, 2},\r
+ {0,0,0}\r
+ };\r
+ int i;\r
+ for(i=0;_tbl[i].t!=0;i++){\r
+ if(_tbl[i].t==i_type){\r
+ *oprbc_len=_tbl[i].oprbc_len;\r
+ *o_istlen=_tbl[i].ist_len;\r
+ return;\r
+ }\r
+ }\r
+ NyLPC_Abort();\r
+ return;\r
}\r
\r
#define TEST\r
#ifndef TEST\r
void main(void)\r
{\r
- struct NyLPC_TCharArrayPtr bc;\r
- const char* BC="AA0102AB0100000001AE0203AF0200000003AI0304AJ0300000004AM07BA0505BE0607CA0304CB0300000005CE0304CF0300000005CI0304CJ0300000005DA0400000000DE0400000000EA04EE04EF00000000ZAZZ.E";\r
- NyLPC_TcMiMicTxtCompiler_t inst;\r
- struct NyLPC_TUInt32ArrayPtr bin;\r
-\r
- NyLPC_TUInt16 l,bl;\r
- NyLPC_TUInt32 obuf[1024];\r
- NyLPC_cMiMicBcCompiler_initialize(&inst);\r
- bc.ptr=(char* )BC;\r
- bc.len=strlen(BC);\r
- bin.ptr=obuf;\r
- bin.len=5;\r
-\r
- for(;;){\r
-\r
- switch(NyLPC_cMiMicBcCompiler_compileFragment(&inst,&bc,&bin,&bl,&l))\r
- {\r
- case NyLPC_TcMiMicTxtCompiler_RET_OK:\r
- //命令確定。\r
- NyLPC_TUInt32ArrayPtr_seek(&bin,bl);\r
- NyLPC_TCharArrayPtr_seek(&bc,l);\r
- break;\r
- case NyLPC_TcMiMicTxtCompiler_RET_OK_END:\r
- //命令終端\r
- printf("OK");\r
- break;\r
- case NyLPC_TcMiMicTxtCompiler_RET_CONTINUE:\r
- //蓄積中。\r
- NyLPC_TCharArrayPtr_seek(&bc,l);\r
- break;\r
- case NyLPC_TcMiMicTxtCompiler_RET_NG:\r
- printf("エラー");\r
- return;\r
- default:\r
- break;\r
- }\r
- }\r
+ struct NyLPC_TCharArrayPtr bc;\r
+ const char* BC="AA0102AB0100000001AE0203AF0200000003AI0304AJ0300000004AM07BA0505BE0607CA0304CB0300000005CE0304CF0300000005CI0304CJ0300000005DA0400000000DE0400000000EA04EE04EF00000000ZAZZ.E";\r
+ NyLPC_TcMiMicTxtCompiler_t inst;\r
+ struct NyLPC_TUInt32ArrayPtr bin;\r
+\r
+ NyLPC_TUInt16 l,bl;\r
+ NyLPC_TUInt32 obuf[1024];\r
+ NyLPC_cMiMicBcCompiler_initialize(&inst);\r
+ bc.ptr=(char* )BC;\r
+ bc.len=strlen(BC);\r
+ bin.ptr=obuf;\r
+ bin.len=5;\r
+\r
+ for(;;){\r
+\r
+ switch(NyLPC_cMiMicBcCompiler_compileFragment(&inst,&bc,&bin,&bl,&l))\r
+ {\r
+ case NyLPC_TcMiMicTxtCompiler_RET_OK:\r
+ //命令確定。\r
+ NyLPC_TUInt32ArrayPtr_seek(&bin,bl);\r
+ NyLPC_TCharArrayPtr_seek(&bc,l);\r
+ break;\r
+ case NyLPC_TcMiMicTxtCompiler_RET_OK_END:\r
+ //命令終端\r
+ printf("OK");\r
+ break;\r
+ case NyLPC_TcMiMicTxtCompiler_RET_CONTINUE:\r
+ //蓄積中。\r
+ NyLPC_TCharArrayPtr_seek(&bc,l);\r
+ break;\r
+ case NyLPC_TcMiMicTxtCompiler_RET_NG:\r
+ printf("エラー");\r
+ return;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
}\r
#endif\r
-\r