\r
\r
/**\r
- * 固定長命令+固定長データの実行\r
+ * 固定長命令+固定長データを実行します。\r
+ * 関数の終了条件は、1.EXIT命令に到達する。2.インストラクションの終端に到達する。3.エラーが発生する。です。\r
+ * \r
*/\r
-NyLPC_TBool NyLPC_cMiMicVM_run(NyLPC_TcMiMicVM_t* i_inst,const void* i_instruction)\r
+NyLPC_TBool NyLPC_cMiMicVM_run(NyLPC_TcMiMicVM_t* i_inst,const NyLPC_TUInt32* i_instruction,const NyLPC_TUInt16 i_size_of_instruction)\r
{\r
//データ部をgetstreamと連動させること。\r
- const NyLPC_TUInt8* pc=i_instruction;\r
+ NyLPC_TUInt16 pc=0;\r
NyLPC_TUInt8 proc_in_byte;\r
- proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)pc);\r
- while(proc_in_byte>0){\r
+ i_inst->ret_code=0;\r
+ if(i_size_of_instruction>0){\r
+ proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)(i_instruction+pc));\r
pc+=proc_in_byte;\r
- proc_in_byte=process_instruction(i_inst,(const union NyLPC_TcMiMicVM_TInstruction*)pc);\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));\r
+ pc+=proc_in_byte;\r
+ }\r
}\r
return i_inst->ret_code==0?NyLPC_TBool_TRUE:NyLPC_TBool_FALSE;\r
}\r
* インストラクションを1個処理し、処理したバイト数を返す。\r
* インストラクションの境界値はチェックされないので、コンパイル時にチェックしておくこと。\r
* @return\r
- * å\87¦ç\90\86ã\81\97ã\81\9fã\82¤ã\83³ã\82¹ã\83\88ã\83©ã\82¯ã\82·ã\83§ã\83³ã\81®ã\83\90ã\82¤ã\83\88æ\95°。\r
+ * å\87¦ç\90\86ã\81\97ã\81\9fã\82¤ã\83³ã\82¹ã\83\88ã\83©ã\82¯ã\82·ã\83§ã\83³ã\81®ã\83¯ã\83¼ã\83\89æ\95°(UInt32å\8d\98ä½\8d)。\r
* 終了した場合は0を返す。0を返したときは、ret_codeメンバをチェックして、理由を調べること。\r
*/\r
static NyLPC_TUInt8 process_instruction(NyLPC_TcMiMicVM_t* i_inst,const union NyLPC_TcMiMicVM_TInstruction* ist)\r
default:\r
NyLPC_OnErrorGoto(ERROR);\r
}\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:\r
case NyLPC_TcMiMicVM_OPR_TYPE_H8:\r
case NyLPC_TcMiMicVM_OPR_TYPE_H16:\r
- return 4;\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
- return 8;\r
+ return 2;\r
}\r
ERROR:\r
i_inst->ret_code=1;\r
#include "NyLPC_cMiMicTxtCompiler.h"\r
void main(void)\r
{\r
- int a=10;\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
- const char* rp;\r
- NyLPC_TcMiMicTxtCompiler_t cm;\r
- NyLPC_TUInt16 l;\r
- NyLPC_TUInt8 obuf[1024];\r
- void* ap=&a;\r
+ int ist_len;\r
\r
- NyLPC_TcMiMicVM_t vm;\r
- sprintf(BC,"AA0102AB0100000001AE0203AF0200000003AI0304AJ0300000004AM07BA0505BE0607CA0304CB0300000005CE0304CF0300000005CI0304CJ0300000005DA04%08xDE04%08xEA04EE04EF00000000ZAZZ.E",ap,ap);\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
\r
- NyLPC_cMiMicBcCompiler_initialize(&cm);\r
- rp=BC;\r
- NyLPC_cMiMicTxtCompiler_setOutputBuf(&cm,obuf,1024);\r
- if(!NyLPC_cMiMicBcCompiler_compileFragment(&cm,rp,strlen(BC),&l)){\r
- printf("エラー");\r
- }\r
-\r
- NyLPC_cMiMicVM_initialize(&vm);\r
- if(!NyLPC_cMiMicVM_run(&vm,obuf,NULL,NULL)){\r
- printf("エンダァ");\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
- return;\r
}\r
-#endif\r
-\r
+#endif
\ No newline at end of file