* 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
void NyLPC_cMiMicVM_initialize(NyLPC_TcMiMicVM_t* i_inst,struct NyLPC_TcMiMicVM_TEvent* i_handler)\r
{\r
- NyLPC_Assert(i_inst!=NULL);\r
- NyLPC_Assert(i_handler!=NULL);\r
- NyLPC_Assert(i_handler->get_stream!=NULL);\r
- NyLPC_Assert(i_handler->put_stream!=NULL);\r
- NyLPC_Assert(i_handler->sleep!=NULL);\r
- i_inst->_event_handler=i_handler;\r
- return;\r
+ NyLPC_Assert(i_inst!=NULL);\r
+ NyLPC_Assert(i_handler!=NULL);\r
+ NyLPC_Assert(i_handler->get_stream!=NULL);\r
+ NyLPC_Assert(i_handler->put_stream!=NULL);\r
+ NyLPC_Assert(i_handler->sleep!=NULL);\r
+ i_inst->_event_handler=i_handler;\r
+ return;\r
}\r
\r
\r
*/\r
NyLPC_TUInt32 NyLPC_cMiMicVM_run(NyLPC_TcMiMicVM_t* i_inst,const NyLPC_TUInt32* i_instruction,const NyLPC_TUInt16 i_size_of_instruction)\r
{\r
- //データ部をgetstreamと連動させること。\r
- NyLPC_TUInt32 retcode=NyLPC_cMiMicVM_RESULT_OK;\r
- NyLPC_TUInt16 pc=0;\r
- NyLPC_TUInt8 proc_in_byte;\r
- if(i_size_of_instruction>0){\r
- proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)(i_instruction+pc),&retcode);\r
- pc+=proc_in_byte;\r
- //プログラムの終端に到達するか、0バイト処理の場合にブレーク。\r
- while(proc_in_byte>0 && pc<i_size_of_instruction){\r
- proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)(i_instruction+pc),&retcode);\r
- pc+=proc_in_byte;\r
- }\r
- }\r
- return retcode;\r
+ //データ部をgetstreamと連動させること。\r
+ NyLPC_TUInt32 retcode=NyLPC_cMiMicVM_RESULT_OK;\r
+ NyLPC_TUInt16 pc=0;\r
+ NyLPC_TUInt8 proc_in_byte;\r
+ if(i_size_of_instruction>0){\r
+ proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)(i_instruction+pc),&retcode);\r
+ pc+=proc_in_byte;\r
+ //プログラムの終端に到達するか、0バイト処理の場合にブレーク。\r
+ while(proc_in_byte>0 && pc<i_size_of_instruction){\r
+ proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)(i_instruction+pc),&retcode);\r
+ pc+=proc_in_byte;\r
+ }\r
+ }\r
+ return retcode;\r
}\r
/**\r
* 出力ストリームへ32ビット値を書き出す。\r
*/\r
NyLPC_TBool NyLPC_cMiMicVM_sput(NyLPC_TcMiMicVM_t* i_inst,NyLPC_TUInt32 i_val)\r
{\r
- if(!i_inst->_event_handler->put_stream(i_inst->_event_handler,i_val)){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- return NyLPC_TBool_TRUE;\r
+ if(!i_inst->_event_handler->put_stream(i_inst->_event_handler,i_val)){\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
}\r
/**\r
* 入力ストリームから32ビット値を読み出す。\r
*/\r
NyLPC_TBool NyLPC_cMiMicVM_sget(NyLPC_TcMiMicVM_t* i_inst,NyLPC_TUInt32* o_val)\r
{\r
- if(!i_inst->_event_handler->get_stream(i_inst->_event_handler,o_val)){\r
- return NyLPC_TBool_FALSE;\r
- }\r
- return NyLPC_TBool_TRUE;\r
+ if(!i_inst->_event_handler->get_stream(i_inst->_event_handler,o_val)){\r
+ return NyLPC_TBool_FALSE;\r
+ }\r
+ return NyLPC_TBool_TRUE;\r
}\r
\r
\r
*/\r
static NyLPC_TUInt8 process_instruction(NyLPC_TcMiMicVM_t* i_inst,const union NyLPC_TcMiMicVM_TInstruction* ist,NyLPC_TUInt32* o_code)\r
{\r
- NyLPC_TUInt32 tret;\r
- switch(ist->op.opc){\r
- case NyLPC_TcMiMicVM_OP_TYPE_AND:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- i_inst->wm[ist->wmwm_32.wm1]&=i_inst->wm[ist->wmwm_32.wm2];\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
- i_inst->wm[ist->wmh32_64.wm]&=ist->wmh32_64.h32;\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_OR:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- i_inst->wm[ist->wmwm_32.wm1]|=i_inst->wm[ist->wmwm_32.wm2];\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
- i_inst->wm[ist->wmh32_64.wm]|=ist->wmh32_64.h32;\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_XOR:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- i_inst->wm[ist->wmwm_32.wm1]^=i_inst->wm[ist->wmwm_32.wm2];\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
- i_inst->wm[ist->wmh32_64.wm]^=ist->wmh32_64.h32;\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_NOT:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
- i_inst->wm[ist->wm_32.wm]=~i_inst->wm[ist->wm_32.wm];\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_SHL:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H08:\r
- i_inst->wm[ist->wmh08_32.wm]=i_inst->wm[ist->wmh08_32.wm]<<ist->wmh08_32.h8;\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- i_inst->wm[ist->wmwm_32.wm1]=i_inst->wm[ist->wmwm_32.wm1]<<i_inst->wm[ist->wmwm_32.wm2];\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_SHR:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H08:\r
- i_inst->wm[ist->wmh08_32.wm]=i_inst->wm[ist->wmh08_32.wm]>>ist->wmh08_32.h8;\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- i_inst->wm[ist->wmwm_32.wm1]=i_inst->wm[ist->wmwm_32.wm1]>>i_inst->wm[ist->wmwm_32.wm2];\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_ADD:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- i_inst->wm[ist->wmwm_32.wm1]+=i_inst->wm[ist->wmwm_32.wm2];\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
- i_inst->wm[ist->wmh32_64.wm]+=ist->wmh32_64.h32;\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_SUB:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- i_inst->wm[ist->wmwm_32.wm1]-=i_inst->wm[ist->wmwm_32.wm2];\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
- i_inst->wm[ist->wmh32_64.wm]-=ist->wmh32_64.h32;\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_MUL:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- i_inst->wm[ist->wmwm_32.wm1]*=i_inst->wm[ist->wmwm_32.wm2];\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
- i_inst->wm[ist->wmh32_64.wm]*=ist->wmh32_64.h32;\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_MGET:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
- i_inst->wm[ist->wmh32_64.wm]=*((NyLPC_TUInt32*)(ist->wmh32_64.h32));\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- i_inst->wm[ist->wmwm_32.wm1]=*((NyLPC_TUInt32*)(i_inst->wm[ist->wmwm_32.wm2]));\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_MPUT:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
- *((NyLPC_TUInt32*)(ist->wmh32_64.h32))=i_inst->wm[ist->wmh32_64.wm];\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- *((NyLPC_TUInt32*)(i_inst->wm[ist->wmwm_32.wm2]))=i_inst->wm[ist->wmwm_32.wm1];\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_SGET:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
- if(!i_inst->_event_handler->get_stream(i_inst->_event_handler,&(i_inst->wm[ist->wm_32.wm]))){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_SPUT:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
- if(!i_inst->_event_handler->put_stream(i_inst->_event_handler,i_inst->wm[ist->wm_32.wm])){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_H32:\r
- if(!i_inst->_event_handler->put_stream(i_inst->_event_handler,ist->h32_64.h32)){\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_LD:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- i_inst->wm[ist->wmwm_32.wm1]=i_inst->wm[ist->wmwm_32.wm2];\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
- i_inst->wm[ist->wmh32_64.wm]=ist->wmh32_64.h32;\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_NOP:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_NONE:\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_H08:\r
- i_inst->_event_handler->sleep(i_inst->_event_handler,ist->h8_32.h8);\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- //native call\r
- case NyLPC_TcMiMicVM_OP_TYPE_CALL:\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
- tret=i_inst->_event_handler->native_call(i_inst->_event_handler,i_inst->wm[ist->wm_32.wm],i_inst);\r
- if(!NyLPC_cMiMicVM_RESULT_isOK(tret)){\r
- *o_code=tret;\r
- NyLPC_OnErrorGoto(ERROR_INHERIT);//エラー継承\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_H32:\r
- tret=i_inst->_event_handler->native_call(i_inst->_event_handler,ist->h32_64.h32,i_inst);\r
- if(!NyLPC_cMiMicVM_RESULT_isOK(tret)){\r
- *o_code=tret;\r
- NyLPC_OnErrorGoto(ERROR_INHERIT);//エラー継承\r
- }\r
- break;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- break;\r
- case NyLPC_TcMiMicVM_OP_TYPE_EXIT:\r
- *o_code=NyLPC_cMiMicVM_RESULT_OK;//OKに上書き\r
- return 0;\r
- default:\r
- NyLPC_OnErrorGoto(ERROR);\r
- }\r
- //実行したコードのワード長を返す。\r
- switch(ist->op.oprtype){\r
- case NyLPC_TcMiMicVM_OPR_TYPE_NONE:\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H08:\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
- case NyLPC_TcMiMicVM_OPR_TYPE_H08:\r
- case NyLPC_TcMiMicVM_OPR_TYPE_H16:\r
- *o_code=NyLPC_cMiMicVM_RESULT_OK;//OKに上書き\r
- return 1;\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H16:\r
- case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
- case NyLPC_TcMiMicVM_OPR_TYPE_H32:\r
- *o_code=NyLPC_cMiMicVM_RESULT_OK;//OKに上書き\r
- return 2;\r
- }\r
+ NyLPC_TUInt32 tret;\r
+ switch(ist->op.opc){\r
+ case NyLPC_TcMiMicVM_OP_TYPE_AND:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ i_inst->wm[ist->wmwm_32.wm1]&=i_inst->wm[ist->wmwm_32.wm2];\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
+ i_inst->wm[ist->wmh32_64.wm]&=ist->wmh32_64.h32;\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_OR:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ i_inst->wm[ist->wmwm_32.wm1]|=i_inst->wm[ist->wmwm_32.wm2];\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
+ i_inst->wm[ist->wmh32_64.wm]|=ist->wmh32_64.h32;\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_XOR:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ i_inst->wm[ist->wmwm_32.wm1]^=i_inst->wm[ist->wmwm_32.wm2];\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
+ i_inst->wm[ist->wmh32_64.wm]^=ist->wmh32_64.h32;\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_NOT:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
+ i_inst->wm[ist->wm_32.wm]=~i_inst->wm[ist->wm_32.wm];\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_SHL:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H08:\r
+ i_inst->wm[ist->wmh08_32.wm]=i_inst->wm[ist->wmh08_32.wm]<<ist->wmh08_32.h8;\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ i_inst->wm[ist->wmwm_32.wm1]=i_inst->wm[ist->wmwm_32.wm1]<<i_inst->wm[ist->wmwm_32.wm2];\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_SHR:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H08:\r
+ i_inst->wm[ist->wmh08_32.wm]=i_inst->wm[ist->wmh08_32.wm]>>ist->wmh08_32.h8;\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ i_inst->wm[ist->wmwm_32.wm1]=i_inst->wm[ist->wmwm_32.wm1]>>i_inst->wm[ist->wmwm_32.wm2];\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_ADD:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ i_inst->wm[ist->wmwm_32.wm1]+=i_inst->wm[ist->wmwm_32.wm2];\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
+ i_inst->wm[ist->wmh32_64.wm]+=ist->wmh32_64.h32;\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_SUB:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ i_inst->wm[ist->wmwm_32.wm1]-=i_inst->wm[ist->wmwm_32.wm2];\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
+ i_inst->wm[ist->wmh32_64.wm]-=ist->wmh32_64.h32;\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_MUL:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ i_inst->wm[ist->wmwm_32.wm1]*=i_inst->wm[ist->wmwm_32.wm2];\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
+ i_inst->wm[ist->wmh32_64.wm]*=ist->wmh32_64.h32;\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_MGET:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
+ i_inst->wm[ist->wmh32_64.wm]=*((NyLPC_TUInt32*)(ist->wmh32_64.h32));\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ i_inst->wm[ist->wmwm_32.wm1]=*((NyLPC_TUInt32*)(i_inst->wm[ist->wmwm_32.wm2]));\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_MPUT:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
+ *((NyLPC_TUInt32*)(ist->wmh32_64.h32))=i_inst->wm[ist->wmh32_64.wm];\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ *((NyLPC_TUInt32*)(i_inst->wm[ist->wmwm_32.wm2]))=i_inst->wm[ist->wmwm_32.wm1];\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_SGET:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
+ if(!i_inst->_event_handler->get_stream(i_inst->_event_handler,&(i_inst->wm[ist->wm_32.wm]))){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_SPUT:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
+ if(!i_inst->_event_handler->put_stream(i_inst->_event_handler,i_inst->wm[ist->wm_32.wm])){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_H32:\r
+ if(!i_inst->_event_handler->put_stream(i_inst->_event_handler,ist->h32_64.h32)){\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_LD:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ i_inst->wm[ist->wmwm_32.wm1]=i_inst->wm[ist->wmwm_32.wm2];\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
+ i_inst->wm[ist->wmh32_64.wm]=ist->wmh32_64.h32;\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_NOP:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_NONE:\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_H08:\r
+ i_inst->_event_handler->sleep(i_inst->_event_handler,ist->h8_32.h8);\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ //native call\r
+ case NyLPC_TcMiMicVM_OP_TYPE_CALL:\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
+ tret=i_inst->_event_handler->native_call(i_inst->_event_handler,i_inst->wm[ist->wm_32.wm],i_inst);\r
+ if(!NyLPC_cMiMicVM_RESULT_isOK(tret)){\r
+ *o_code=tret;\r
+ NyLPC_OnErrorGoto(ERROR_INHERIT);//エラー継承\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_H32:\r
+ tret=i_inst->_event_handler->native_call(i_inst->_event_handler,ist->h32_64.h32,i_inst);\r
+ if(!NyLPC_cMiMicVM_RESULT_isOK(tret)){\r
+ *o_code=tret;\r
+ NyLPC_OnErrorGoto(ERROR_INHERIT);//エラー継承\r
+ }\r
+ break;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ break;\r
+ case NyLPC_TcMiMicVM_OP_TYPE_EXIT:\r
+ *o_code=NyLPC_cMiMicVM_RESULT_OK;//OKに上書き\r
+ return 0;\r
+ default:\r
+ NyLPC_OnErrorGoto(ERROR);\r
+ }\r
+ //実行したコードのワード長を返す。\r
+ switch(ist->op.oprtype){\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_NONE:\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_WM:\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H08:\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM:\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_H08:\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_H16:\r
+ *o_code=NyLPC_cMiMicVM_RESULT_OK;//OKに上書き\r
+ return 1;\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H16:\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_WM_H32:\r
+ case NyLPC_TcMiMicVM_OPR_TYPE_H32:\r
+ *o_code=NyLPC_cMiMicVM_RESULT_OK;//OKに上書き\r
+ return 2;\r
+ }\r
ERROR:\r
- *o_code=NyLPC_cMiMicVM_RESULT_RUNTIME_NG;//ランタイムNG\r
+ *o_code=NyLPC_cMiMicVM_RESULT_RUNTIME_NG;//ランタイムNG\r
ERROR_INHERIT:\r
- return 0;\r
+ return 0;\r
}\r
\r
#define TEST\r
#include "NyLPC_cMiMicTxtCompiler.h"\r
void main(void)\r
{\r
- struct NyLPC_TcMiMicVM_TEvent eh;\r
- NyLPC_TUInt32 ap;\r
- NyLPC_TcMiMicVM_t vm;\r
- struct NyLPC_TCharArrayPtr bc;\r
- NyLPC_TcMiMicTxtCompiler_t inst;\r
- struct NyLPC_TUInt32ArrayPtr bin;\r
- char BC[1024];\r
- int ist_len;\r
+ struct NyLPC_TcMiMicVM_TEvent eh;\r
+ NyLPC_TUInt32 ap;\r
+ NyLPC_TcMiMicVM_t vm;\r
+ struct NyLPC_TCharArrayPtr bc;\r
+ NyLPC_TcMiMicTxtCompiler_t inst;\r
+ struct NyLPC_TUInt32ArrayPtr bin;\r
+ char BC[1024];\r
+ int ist_len;\r
\r
- NyLPC_TUInt16 l,bl;\r
- NyLPC_TUInt32 obuf[1024];\r
- NyLPC_cMiMicBcCompiler_initialize(&inst);\r
- sprintf(BC,"AA0102AB0100000001AE0203AF0200000003AI0304AJ0300000004AM07BA0505BE0607CA0304CB0300000005CE0304CF0300000005CI0304CJ0300000005ZA.E",&ap,&ap);\r
- bc.ptr=(char* )BC;\r
- bc.len=strlen(BC);\r
- bin.ptr=obuf;\r
- bin.len=100;\r
- ist_len=0;\r
+ NyLPC_TUInt16 l,bl;\r
+ NyLPC_TUInt32 obuf[1024];\r
+ NyLPC_cMiMicBcCompiler_initialize(&inst);\r
+ sprintf(BC,"AA0102AB0100000001AE0203AF0200000003AI0304AJ0300000004AM07BA0505BE0607CA0304CB0300000005CE0304CF0300000005CI0304CJ0300000005ZA.E",&ap,&ap);\r
+ bc.ptr=(char* )BC;\r
+ bc.len=strlen(BC);\r
+ bin.ptr=obuf;\r
+ bin.len=100;\r
+ ist_len=0;\r
\r
- for(;;){\r
+ for(;;){\r
\r
- switch(NyLPC_cMiMicBcCompiler_compileFragment(&inst,&bc,&bin,&bl,&l))\r
- {\r
- case NyLPC_TcMiMicTxtCompiler_RET_OK:\r
- //命令確定。\r
- NyLPC_TCharArrayPtr_seek(&bc,l);\r
- ist_len+=bl;\r
- break;\r
- case NyLPC_TcMiMicTxtCompiler_RET_OK_END:\r
- //命令終端\r
- NyLPC_cMiMicVM_initialize(&vm,&eh);\r
- if(!NyLPC_cMiMicVM_run(&vm,obuf,ist_len)){\r
- printf("エンダァ");\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
+ switch(NyLPC_cMiMicBcCompiler_compileFragment(&inst,&bc,&bin,&bl,&l))\r
+ {\r
+ case NyLPC_TcMiMicTxtCompiler_RET_OK:\r
+ //命令確定。\r
+ NyLPC_TCharArrayPtr_seek(&bc,l);\r
+ ist_len+=bl;\r
+ break;\r
+ case NyLPC_TcMiMicTxtCompiler_RET_OK_END:\r
+ //命令終端\r
+ NyLPC_cMiMicVM_initialize(&vm,&eh);\r
+ if(!NyLPC_cMiMicVM_run(&vm,obuf,ist_len)){\r
+ printf("エンダァ");\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